讓我們回到 Log 這個主題,在 D24 - Log 已經說明了 Log 的重要性,
然而,我也還對 Docker Log 不夠熟悉,因此我們來搜尋看看其他人是怎麼說的,
我使用的 Google 關鍵字是 docker log best practice
,並主觀地選了第三個搜尋結果:
Docker Logging: 101 Guide to Logs, Best Practices & More,來介紹一下其中的兩個段落。
這篇文章的一開始,先簡介了關於 Docker、Container、與 Log,接著的段落就說明「Docker Logging 與一般的 Logging 哪裡不同」,
作者總結成了兩點:
為什麼說是短暫的呢?並不是說一個 Docker 真的只會存在很短的時間,而是 Container 本身是很容易被移除的,
被移除後,附屬在 container 下的資源也都會消失,例如沒有綁定 volume 的檔案、Log 紀錄,
Docker log 的內容是由 Docker Container 的 stdout、stderr 組成的,會被存放在 /var/lib/docker/containers/
這個路徑下,除了 Log 會影響到 Server 的硬碟容量以外,在 container 移除後也會被清空,
第二點說的多個層次,則是指 Container 在執行時的關聯性,
即使是最簡化的情況下,Container 跟執行 Docker 的主機本身,就已經有兩個層次了,如果服務是由一組 Container 所組成的,還會讓狀況更加複雜。
作者在文章中,整理了五種處理 Docker Log 的方法:
不同的語言、框架對於 Log 的處理方式可能都不同,於是最簡易的方式就是讓程式自己處理 Log,例如把 Log 都集中送到雲端平台上。
跟第一個方法很類似,不同的是會把 Log 寫入檔案中,並把檔案用 Docker Volume 的方式綁定 (或說掛載) 到指定的路徑去,同樣也能把 Log 保存下來,
這個方法的缺點,是如果我們需要把 Container 移植到其他 Server 上時,已存在的 Log 就需要另外搬遷,可能會造成移植的時間變長、或是 Log 會被直接捨棄。
Docker Log 預設會被寫入到 Server 的指定路徑上,
而 Docker 也提供能用自定義的 Driver,意思是 Container 的 stdout、stderr 不會寫入到預設路徑,而是改成執行自定義的行為,但相對的,有些功能會被限制。
這是作者最推薦的方式,
啟動一個專責的 Container 來處理、收集 Log,這也比較符合 Docker 的設計 — 把各個需要的服務拆細後分開來,類似 關注點分離 的概念。
側車 (Sidecar) 用來加裝在機車旁,增加一位乘坐人數,
這個模式的作法,跟專責的 Container 很像,都會啟動獨立的 container,
不一樣的是,在原本每一個服務中的 container,都附帶上一個額外 logging container,讓各自的 logging container 專責處理單一 container 的 log。
關於 Docker Log,就像其他各種設計一樣,也有很多種處理方式,各有優缺點,
就盡可能地選擇當下最適中的方法吧。